package com.hevery.security.core.validate.code;

import com.hevery.security.core.properties.SecurityProperties;
import com.hevery.security.core.validate.code.image.ImageCodeGenerator;
import com.hevery.security.core.validate.code.sms.DefaultSmsCodeSender;
import com.hevery.security.core.validate.code.sms.SmsCodeSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author: zhy
 * @description:
 * @date: created on 2017/11/1
 * @modified by:
 */
@Configuration
public class ValidateCodeBeanConfig {
    @Autowired
    private SecurityProperties securityProperties;
    /**
     * 方法的名字就是bean的名字@Bean+方法的业务逻辑实际上就是相当于把ValidateCodeGenerator以@Component的方式进行注入。而@ConditionalOnMissingBean这个注解
     * 会让Spring在初始化这个bean之前先在系统中找一下是否已经存在名字为imageCodeGenerator的bean。
     * 如果找到，那么就不会执行方法中的逻辑，而是使用已经找到的bean作为imageCodeGenerator。
     * @return ValidateCodeGenerator
     */
    @Bean
    @ConditionalOnMissingBean(name = "imageCodeGenerator")
    public ValidateCodeGenerator imageCodeGenerator(){
        ImageCodeGenerator codeGenerator = new ImageCodeGenerator();
        codeGenerator.setSecurityProperties(securityProperties);
        return codeGenerator;
    }

    /**
     * 注册bean的时候当然也可以写成向注解@ConditionalOnMissingBean中传入SmsCodeSender.class，如果在系统里找到了这个接口的实现，
     * 那么就不会使用smsCodeSender这个方法的具体实现了。
     * @return SmsCodeSender
     */
    @Bean
    @ConditionalOnMissingBean(SmsCodeSender.class)
    public SmsCodeSender smsCodeSender(){
        return new DefaultSmsCodeSender();
    }
}
